package com.csj.cloud.front.config.queue;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author:ChengshaoJie
 * @Description:D:代表持久化，TTL代表有效期DLX代表死信队列
 * @Date:Created in 下午 2:00 2019/11/27 0027
 */
@Configuration
public class QueueConfig {
    @Bean
    public Queue queue(){
        return new Queue("userQueue");
    }

    /**
     * 1.通配符模式（Topic Exchange）topic 是RabbitMQ中最灵活的一种方式，可以根据routing_key自由的绑定不同的队列
     * 既然定义了topic模式，那么就需要一个交换机,并绑定
     * 加入了路由键后，消息发往哪个队列就由路由键来决定了。
     * */
    @Bean
    public Queue queueTopic(){
        return new Queue("tQueue");
    }
    @Bean
    public Queue queueTopic2(){
        return new Queue("tQueue2");
    }
    /**
     *2.定义一个交换机
     * */
    @Bean
    TopicExchange exchange() {
        return new TopicExchange("exchange");
    }
    /**
     * 3.绑定交换机和队列,设置一个路由键
     * */
    @Bean
    Binding bindingExchangeMessage(Queue queueTopic, TopicExchange exchange) {
        return BindingBuilder.bind(queueTopic).to(exchange).with("topic.message");
    }

    /**
     * 4.绑定交换机和队列,设置另一个路由键，一个交换机绑定多个路由键，绑定另一个队列
     * */
    @Bean
    Binding bindingExchangeMessage2(Queue queueTopic2, TopicExchange exchange) {
        return BindingBuilder.bind(queueTopic2).to(exchange).with("topic.#");
    }

    /**
     * Fanout Exchange
     * Fanout 就是我们熟悉的广播模式或者订阅模式，给Fanout交换机发送消息，绑定了这个交换机的所有队列都收到这个消息。
     * */

    /**
     *1.定义两个队列
     */
    @Bean
    public Queue fQueue(){
        return new Queue("fQueue1");
    }
    @Bean
    public Queue fQueue2(){
        return new Queue("fQueue2");
    }
    /**
     * 2.定义广播交换机
     * */
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fExchange");
    }

    /**
     * 3.绑定队列和交换机
     * */
    @Bean
    Binding  bindingFE1(Queue fQueue,FanoutExchange  exchange){
        return BindingBuilder.bind(fQueue).to(exchange);
    }
    @Bean
    Binding  bindingFE2(Queue fQueue2,FanoutExchange  exchange){
        return BindingBuilder.bind(fQueue2).to(exchange);
    }
}
